package main

import (
	"fmt"
	"sync"
	"time"
)

/*
锁-资源竞争
读写锁
*/
var total int
var wg sync.WaitGroup

// 互斥锁-解决同步问题 能不用尽量不用锁 因为性能
var rwlock sync.RWMutex

// 针对绝大分部web来说，都是读大于写，例如 有1w个人同时读数据库，a读的时候 b能读么，要加锁 就是要同步数据 防止用户读到数据一致
// 这样就严重影响性能
func read() {
	defer wg.Done() // 代码严谨必须用defer 等函数执行完再运行wg.Done()
	rwlock.RLock()
	fmt.Println("开始读取数据")
	time.Sleep(time.Second * 10)
	fmt.Println("读取成功")
	rwlock.RUnlock()
}
func write() {
	defer wg.Done() // 代码严谨必须用defer 等函数执行完再运行wg.Done()
	rwlock.Lock()
	fmt.Println("开始修改数据")
	time.Sleep(time.Second * 10)
	fmt.Println("修改成功")
	rwlock.Unlock()
}
func main() {
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go read() // 不管读取持续多长时间 都是可以同步执行的
	}
	for i := 0; i < 1; i++ {
		go write() // 此处只有当写锁执行完成解锁，其他的读操作才可以运行
	}
	wg.Wait()
	fmt.Println(total)
}
